package org.darkforest.common.services;

import org.darkforest.common.wxpay.dto.WxPayResult;
import org.darkforest.model.*;
import org.darkforest.vo.*;

import java.util.List;
import java.util.Map;

/**
 * Created by Libing on 2015/3/20.
 */
public interface OrderService {

    /**
     * 生成订单
     * @param orderCreator
     * @return 返回生成的订单号
     */
    Order addOrder(OrderCreator orderCreator)throws Exception;

    /**
     * 生成秒杀订单
     * @param orderCreator
     * @return
     * @throws Exception
     */
    Order addMsOrder(OrderCreator orderCreator) throws Exception;

    /**
     * 根据主键修改订单
     * @param order
     * @return
     */
    Order updateOrderByPrimary(Order order);

    /**
     * 修改订单公共类
     * @param orderCommon
     * @return
     */
    OrderCommon updateOrderCommonByPrimaryP(OrderCommon orderCommon);


    /**
     * 根据主键获取订单所有信息
     * @param orderId
     * @return
     */
    OrderImformation getOrderImformationByPrimary(Integer orderId);

    List<Order> findOrderInfoByCondition(Order order);

    public PayInfoVo getPayInfoBySn(String payNo);

    /**
     * 查询下单时间超过45分钟并且未支付的订单
     */
    List<Order> CancleUnpayOrderList();

    /**
     * 取消下单时间超过45分钟并且未支付的订单
     */
    void updateOrderStatusByBatch(Map<String, Object> map);

    /**
     * 根据订单主键查询订单信息
     * @param orderId
     * @return
     */
    Order selectOrderByPrimaryKey(Integer orderId);


    List<OrderVo> selectListByCondition(OrderSearchBean page);

    public OrderVo selectById(int id);

    public void  updateByPrimaryKeySelective(Order order);

    public PayInfoVo getPayInfoByPayno(String payNo);
    /**
     * 生成订单
     * @param orderCreator
     * @return 返回生成的订单号
     */
    OrderPay addOrderAndOrderPay(OrderCreator orderCreator)throws Exception;

    public void orderPay(int memberId,String payNo,String pdAmount,String payType);

    /**
     * 查询订单交易情况
     * @return
     * @param storeId
     */
    Map<String, Object> findTransactionInfo(Integer storeId);


    int doCancelOrder(Order order,MemberBase admin);

    /**
     * 取消超时未支付订单
     */
    void cancleUnpayOrder();

    /**
     * 微信扫码支付成功回调
     * @param wpr
     */
    void wxPayCallBack(WxPayResult wpr);

    public int payForPdAmount(Order order);

    /**
     * 定时任务 超过10天的订单设置自动收货 并且自动评价
     */
    void AutoReceiveAndEvaluate();
    /**
     * 店铺销量前30
     * @param order
     * @return
     */
    List<Map<String,Object>> findGoodsTop30ByCondition(Order order);

    /**
     * 统计销售额走势
     * @param order
     * @return
     */
    List<Map<String,Object>> findAmountByCondition(Order order);
    /**
     * 统计最新情报
     * @param order
     * @return
     */
    List<Map<String,Object>> findIndexByCondition(Order order);


    /**
     * 根据时间内容查询订单列表
     * @param order
     * @return
     */
    List<Order> selectOrderListByDateCondition(OrderSearchBean order);

    /**
     * 根据时间统计订单销售额
     * @param order
     * @return
     */
    Map<String,Object> staticsOrderAmountByDateCondition(OrderSearchBean order);

    /**
     *根据时间统计订单销售量
     * @param order
     * @return
     */
    Map<String,Object> staticsOrderCountByDateCondition(OrderSearchBean order);


    /**
     * 根据时间统计订单销售额以及销售量
     * @param order
     * @return
     */
    Map<String,Object> staticsOrderCountAndAmountByDateCondition(OrderSearchBean order);

    /**
     * 下单
     * @param postType
     * @param payType
     * @param codeNum
     * @param addressId
     * @param invoiceId
     * @param member  @return
     * @param cartChannel
     */
    AjaxReturnEntity saveOrder(Integer postType, Integer payType, Integer codeNum, Integer addressId, Integer invoiceId, Member member, Integer cartChannel);


    /**
     * 微信jsapi支付回调
     * @param orderVos
     * @param orderPay
     * @param bank_type
     * @param transaction_id
     * @param pay_order_sn     @return
     * @param orderSn
     * */
    boolean wxJsApiPayCallBack(List<OrderVo> orderVos, OrderPay orderPay, String bank_type, String transaction_id, String pay_order_sn, String orderSn);

    /****
     * 会员消费额统计，会员等级
     */
    void orderBalance();

    /**
     * 获取订单以及该订单商品
     */
    List<Order> findOrderWithGoodsByCondition(Order order);

    /**
     * 商家订单佣金统计报表
     */
    void orderCommissionStatistics();


}
